package com.bbz.core.concurrency.work3;
/**
 * volatile修饰的变量能够保证每个线程能够获取该变量的最新值，从而避免出现数据脏读的现象。
 * 原理：volatile将当前处理器缓存行的数据写回系统内存；
	这个写回内存的操作会使得其他CPU里缓存了该内存地址的数据无效
 * @author binbin.a.zhang
 *
 *代码详解，讲isOver设置false, thread 运行后会一直死循环，当启动thread1时，thread1先sleep,
 *然后讲isOver赋值为true,由于有Volatile,所以会将isOver=true回刷主内存,此时thread 的工作内存中的isOver就会失效，
 *然后thread 会重新去主内存中获取 最新的isOver
 */
public class VolatileDemo {
	private static volatile boolean isOver = false;

	public static void main(String[] args) {
		Thread thread = new Thread(new Runnable() {
			@Override
			public void run() {
				while (!isOver)
					;
			}
		});
		thread.start();
		try {
			Thread.sleep(500);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		Thread thread1 = new Thread(new Runnable() {

			@Override
			public void run() {
				try {
					thread.sleep(1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				isOver = true;
			}
		});
		thread1.start();
	}

}
